/*
 * listas.c
 *
 *  Created on: 14/10/2011
 *      Author: utn_so
 */


#include "libPPD.h"


t_lista *crearLista()
{
	t_lista *lista = malloc( sizeof(t_lista) );
	lista->head = NULL;
	return lista;
}

int32_t sacarDeLaLista (t_lista *lista, int num )
{
	int32_t datos = 0;
	t_nodo *aux = NULL;

	if( lista->head == NULL) return 0;
	if( num == 0 )
	{
		aux = lista->head;
		datos = lista->head->datos;
		lista->head = lista->head->next;
	}
	else if(num > 0)
	{
		t_nodo *nodo = lista->head;
		int cont = 0;
		while (cont < (num-1))
		{
			nodo = nodo->next;
			cont++ ;
		}
		datos = nodo->next->datos;
		aux   = nodo->next;
		nodo->next = nodo->next->next;
	}
	free(aux);
	return datos;
}

void agregarEnLaLista( t_lista *lista, int32_t num, int32_t datos )
{
	t_nodo* nodo = NULL;
	t_nodo* nuevoNodo = NULL;
	int cont;
	if(num >= 0)
	{
		nuevoNodo = malloc( sizeof(t_nodo) );
		nuevoNodo->datos = datos;
		if( num == 0)
		{
			nuevoNodo->next = lista->head;
			lista->head = nuevoNodo;
		}
		else
		{
			nodo = lista->head;
			for( cont=0 ; cont < (num-1); nodo=nodo->next,cont++ );
			nuevoNodo->next =  nodo->next;
			nodo->next = nuevoNodo;
		}
	}
}

void ordenarLista (t_lista *lista, t_nodo *nuevoNodo)
{

	if (lista->head == NULL)
	{
		nuevoNodo->next = lista->head;
		lista->head = nuevoNodo;
	}
	else
	{
		int32_t num = 0;
		int32_t salir = 0;
		int32_t pistaNodo;
		int32_t pistaNuevoNodo;

		t_nodo * nodo = lista->head;
		pistaNodo = numeroPista(nodo->datos);
		pistaNuevoNodo = numeroPista(nuevoNodo->datos);

		while ((pistaNodo < pistaNuevoNodo ) && (salir != 1))
		{
			num++;
			if (nodo->next == NULL)
			{
				salir = 1;
			}
			else nodo = nodo->next;
			pistaNodo = numeroPista(nodo->datos);
		}

		agregarEnLaLista (lista, num, nuevoNodo->datos);
	}
}

t_lista *unirListas (t_lista *lista1, t_lista *lista2)
{
	if (lista1->head == NULL)
	{
		free (lista1);
		return lista2;
	}
	else if (lista2->head == NULL)
	{
		free (lista2);
		return lista1;
	}
	else
	{
		t_nodo * nodo = lista1->head;
		while (nodo->next != NULL)
		{
			nodo = nodo->next;
		}
		nodo->next = lista2->head;
		free (lista2);
	}

	return lista1;
}
